#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <unistd.h>
#include <sys/types.h>
#include<sys/wait.h>

/*
   兄弟进程间通信, 实现ps aux | grep bash

   使用execlp函数和dup2函数

   父进程要调用waitpid函数完成对子进程的回收
 */
int main()
{
    //创建管道
    int fd[2];
    int res = pipe(fd);
    int i=0;
    if(res<0)
    {
        perror("pipe error");
        return -1;
    }
    //创建子进程，兄弟进程
    for(;i<2;i++)
    {
        //采用fork函数创建子进程
        pid_t pid=fork();
        if(pid < 0)
        {
            perror("fork error");
            return -1;
        }
        if(pid == 0)
        {
            printf("创建了[%d]个子进程[%d][%d]\n",i,getpid(),getppid());
            break;
        }
    }
    if(i==0)
    {
        //第一个子进程
        //在第一个子进程中利用dup2将STDOUT_FILENO 映射到fd[1]
        //关闭管道读端
        close(fd[0]);
        dup2(fd[1],STDOUT_FILENO);
        execlp("ps","ps","aux",NULL);
        perror("execlp error");
    }
    else if(i==1)
    {
        //第二个子进程
        //在第二个子进程中利用dup2将STDIN_FILENO重定向到fd[0];
        close(fd[1]);
        dup2(fd[0],STDIN_FILENO);
        execlp("grep","grep","--color=auto","bash",NULL);
        perror("execlp error");

    }
    else if(i == 2)
    {
        int status;
        close(fd[0]);
        close(fd[1]);
        while(1)
        {
            pid_t m = waitpid(-1,&status,WNOHANG);
           // printf("m=[%d],",m);
            if(m==-1)
            {
                break;
            }
            //wait(NULL);
            //wait(NULL);
        } 
    }
    return -1;
}


